@@ -331,6 +331,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 331 | 331 |
province = models.CharField(_(u'province'), max_length=255, blank=True, null=True, help_text=u'用户省份') |
| 332 | 332 |
city = models.CharField(_(u'city'), max_length=255, blank=True, null=True, help_text=u'用户城市') |
| 333 | 333 |
location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址') |
| 334 |
+ province_code = models.CharField(_(u'province_code'), max_length=255, blank=True, null=True, help_text=u'用户省份编码') |
|
| 334 | 335 |
|
| 335 | 336 |
# 用户身份 |
| 336 | 337 |
islensman = models.BooleanField(_(u'islensman'), default=False, help_text=_(u'摄影师?'), db_index=True) |
@@ -473,6 +474,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 473 | 474 |
'sex': self.sex, |
| 474 | 475 |
'province': self.province, |
| 475 | 476 |
'city': self.city, |
| 477 |
+ 'province_code': self.province_code, |
|
| 476 | 478 |
'subscribe': self.subscribe, |
| 477 | 479 |
'membercardid': self.membercardid, |
| 478 | 480 |
'memberusercardcode': self.memberusercardcode, |
@@ -8,13 +8,18 @@ from django_logit import logit |
||
| 8 | 8 |
from django_response import response |
| 9 | 9 |
from paginator import pagination |
| 10 | 10 |
from TimeConvert import TimeConvert as tc |
| 11 |
+from django.utils import timezone |
|
| 11 | 12 |
|
| 12 |
-from mch.models import AdministratorInfo, ConsumeInfoSubmitLogInfo |
|
| 13 |
+from mch.models import AdministratorInfo |
|
| 14 |
+from statistic.models import ConsumeModelSaleStatisticInfo |
|
| 13 | 15 |
from account.models import UserInfo |
| 14 | 16 |
from integral.models import SaleclerkSubmitLogInfo |
| 15 | 17 |
from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductCouponStatusCode, |
| 16 | 18 |
ProductMachineStatusCode) |
| 17 | 19 |
|
| 20 |
+from collections import defaultdict |
|
| 21 |
+import json |
|
| 22 |
+ |
|
| 18 | 23 |
|
| 19 | 24 |
WECHAT = settings.WECHAT |
| 20 | 25 |
|
@@ -200,4 +205,44 @@ def userinfo_update(request): |
||
| 200 | 205 |
|
| 201 | 206 |
user.save() |
| 202 | 207 |
|
| 203 |
- return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
|
|
| 208 |
+ return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
|
|
| 209 |
+ |
|
| 210 |
+ |
|
| 211 |
+# #统计 |
|
| 212 |
+def statistic_userprofile(request): |
|
| 213 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
|
|
| 214 |
+ admin_id = request.POST.get('admin_id', '')
|
|
| 215 |
+ start_time = request.POST.get('start_time', '')
|
|
| 216 |
+ end_time = request.POST.get('end_time', '')
|
|
| 217 |
+ model_uni_name = request.POST.get('model_uni_name', '')
|
|
| 218 |
+ |
|
| 219 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
| 220 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
| 221 |
+ |
|
| 222 |
+ try: |
|
| 223 |
+ administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True) |
|
| 224 |
+ except AdministratorInfo.DoesNotExist: |
|
| 225 |
+ return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) |
|
| 226 |
+ |
|
| 227 |
+ if model_uni_name: |
|
| 228 |
+ logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_uni_name, ymd__gte=start_time, ymd__lte=end_time) |
|
| 229 |
+ else: |
|
| 230 |
+ logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time) |
|
| 231 |
+ |
|
| 232 |
+ sexs = {0: 0, 1: 0, 2: 0}
|
|
| 233 |
+ provinces = defaultdict(int) |
|
| 234 |
+ for log in logs: |
|
| 235 |
+ for user in log.users: |
|
| 236 |
+ try: |
|
| 237 |
+ user = UserInfo.objects.get(user_id=user, status=True) |
|
| 238 |
+ except UserInfo.DoesNotExist: |
|
| 239 |
+ continue |
|
| 240 |
+ |
|
| 241 |
+ provinces[user.province_code] += 1 |
|
| 242 |
+ sexs[user.sex] += 1 |
|
| 243 |
+ |
|
| 244 |
+ return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
|
|
| 245 |
+ 'provinces': provinces, |
|
| 246 |
+ 'sexs': sexs, |
|
| 247 |
+ }) |
|
| 248 |
+ |
@@ -293,6 +293,9 @@ urlpatterns += [ |
||
| 293 | 293 |
url(r'^admin/query_usergoods$', admin_views.query_usergoods, name='query_usergoods'), |
| 294 | 294 |
url(r'^admin/query_userinfo$', admin_views.query_userinfo, name='query_userinfo'), |
| 295 | 295 |
url(r'^admin/userinfo_update$', admin_views.userinfo_update, name='userinfo_update'), |
| 296 |
+ |
|
| 297 |
+ #statistic |
|
| 298 |
+ url(r'^admin/statistic/user_profile$', admin_views.statistic_userprofile, name='statistic_userprofile'), |
|
| 296 | 299 |
] |
| 297 | 300 |
|
| 298 | 301 |
urlpatterns += [ |
@@ -10,6 +10,7 @@ from django_models_ext import ProvinceModelMixin, ProvinceShortModelMixin |
||
| 10 | 10 |
from django_six import CompatibilityBaseCommand, close_old_connections |
| 11 | 11 |
|
| 12 | 12 |
from statistic.models import ConsumeProvinceSaleStatisticInfo |
| 13 |
+from account.models import UserInfo |
|
| 13 | 14 |
from utils.redis.connect import r |
| 14 | 15 |
from utils.redis.rkeys import MINI_PROGRAM_GIS_LIST |
| 15 | 16 |
|
@@ -68,6 +69,12 @@ class Command(CompatibilityBaseCommand): |
||
| 68 | 69 |
user_id = v.get('user_id', '')
|
| 69 | 70 |
ymd = v.get('ymd', '')
|
| 70 | 71 |
|
| 72 |
+ #更新用户表 |
|
| 73 |
+ user = UserInfo.objects.get(user_id=user_id, status=True) |
|
| 74 |
+ user.province_code = province_code |
|
| 75 |
+ user.save() |
|
| 76 |
+ |
|
| 77 |
+ |
|
| 71 | 78 |
# [消费者维度]省份销量统计 |
| 72 | 79 |
# 日 |
| 73 | 80 |
cpssi, _ = ConsumeProvinceSaleStatisticInfo.objects.select_for_update().get_or_create( |